package medium.array;

/**
 * <a href="https://leetcode-cn.com/problems/jump-game">55. 跳跃游戏</a>
 * 给定一个非负整数数组nums ，你最初位于数组的 第一个下标 。
 * 数组中的每个元素代表你在该位置可以跳跃的最大长度。
 * 判断你是否能够到达最后一个下标。
 * 示例1：
 *   输入：nums = [2,3,1,1,4]
 *   输出：true
 *   解释：可以先跳 1 步，从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。
 * 示例2：
 *   输入：nums = [3,2,1,0,4]
 *   输出：false
 *   解释：无论怎样，总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 ，所以永远不可能到达最后一个下标。
 * 提示：
 *   1 <= nums.length <= 3 * 104
 *   0 <= nums[i] <= 105
 * 解题思路：第n个元素能跳的范围是n~n+nums[n]，只要这个范围内存在某个元素，跳跃的最远距离能超过这个范围，则表示第n元素可以借助那个元素跳到更远；如果不存在，则没必要再跳下去了，因为不存在借力点，也就跳不了更远
 *   1.统计每个位置能跳到的最远位置，若比原来最远记录更大，则更新最远记录
 *   2.若当前位置已经越过了最远位置，表示上一个位置上的元素为0，且之前所有元素都没能跳过元素0这个位置，即该数组无法跳到最后一个下标
 * @author 刘学松
 * @date 2021-03-16 10:54
 */
public class 跳跃游戏 {
    public boolean canJump(int[] nums) {
        int max = 0;
        for (int i = 0; i < nums.length; i++) {
            if (i > max) {
                return false;
            }
            max = Math.max(max, nums[i] + i);
        }
        return true;
    }
}
